package com.apexbrain.apexbrainserver.mapper;

import com.apexbrain.apexbrainserver.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 用户表tb_user的mapper
 */
@Mapper
public interface UserMapper
{
    /**
     * 通过open id获取用户分数
     * @param userId 微信open id
     * @return 用户的分数（mysql中是int类型，为了防止出现null，这里用String记录）
     */
    @Select("select score from tb_user where user_id = ${userId}")
    String getScore(String userId);

    /**
     * 通过open id获取用户隐藏分（elo分）
     * @param userId 微信open id
     * @return 用户的隐藏分（mysql中是int类型，为了防止出现null，这里用String记录）
     */
    @Select("select elo_score from tb_user where user_id = ${userId}")
    String getEloScore(String userId);

    /**
     * 通过open id获取账号的创建时间
     * @param userId 用户的用户名
     * @return 账号的创建时间（第一次登录小程序的时间）
     */
    @Select("select create_time from tb_user where user_id = ${userId}")
    String getCreateTime(String userId);

    /**
     * 通过open id获取账号的最后登录时间
     * @param userId 用户的用户名
     * @return 账号最后一次登录的时间
     */
    @Select("select last_visit_time from tb_user where user_id = ${userId}")
    String getLastVisitTime(String userId);

    /**
     * 通过open id创建新用户
     * @param userId 用户的用户名
     * @return 返回影响的行数（插入成功返回1，否则返回0）
     */
    @Insert("insert into tb_user (user_id, password, create_time, last_visit_time) values (${userId},${password} , now(), now());")
    boolean createUser(String userId, String password);

    /**
     * 通过open id删除用户
     * @param userId 用户的用户名
     * @return 返回影响的行数（删除成功返回1，否则返回0）
     */
    @Delete("delete from tb_user where user_id = ${userId}")
    boolean deleteUser(String userId);

    /**
     * 设置账号的分数
     * @param userId 用户的用户名
     * @param score 要设置的新分数
     * @return 是否更新成功
     */
    @Update("update tb_user set score = ${score} + score where user_id = ${userId}")
    boolean addScore(String userId, int score);

    /**
     * 设置账号的隐藏分（elo）
     * @param userId 用户的用户名
     * @param eloScore 要设置的新隐藏分
     * @return 返回更新是否成功
     */
    @Update("update tb_user set elo_score = ${eloScore} where user_id = ${userId}")
    boolean setEloScore(String userId, int eloScore);

    /**
     * 获取用户pojo对象
     * @param userId 用户的用户名
     * @return 返回用户的pojo对象
     */
    @Select("select * from tb_user where user_id = ${userId}")
    @Results(id = "user_result_map_id", value = {
            @Result(id = true, column = "user_id", property = "userId"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "last_visit_time", property = "lastVisitTime"),
            @Result(column = "score", property = "score"),
            @Result(column = "elo_score", property = "eloScore")
    })
    User getUser(String userId);

    /**
     * 查询登录用户是否存在
     * @param userId 用户的用户名
     * @param password 用户的密码
     * @return 是否存在
     */
    @Select("select count(*) from tb_user where user_id = ${userId} and password = ${password}")
    boolean checkLogin(String userId, String password);

    /**
     * 获取用户数量
     * @return 用户数量
     */
    @Select("select count(*) from tb_user;")
    int getUserCount();

    /**
     * 获取前十用户排名
     * @return 返回用户列表
     */
    @Select("select * from tb_user order by elo_score DESC limit 10")
    @ResultMap("user_result_map_id")
    List<User> getFirstTenUser();

    /**
     * 获取隐藏分最近的用户
     * @return 返回用户pojo对象
     */
    @Select("select * " +
            "from tb_user as x " +
            "join tb_user_online on x.user_id = tb_user_online.user_id " +
            "where x.user_id != ${userId} and status = 0 " +
            "order by abs( (select elo_score from tb_user as y where y.user_id = x.user_id) - elo_score) " +
            "limit 1;")
    @ResultMap("user_result_map_id")
    User getNearestUser(String userId);

    /**
     * 用户登录，更新在线用户表
     * @param userId 用户的用户名
     * @return 更新是否成功
     */
    @Insert("insert into tb_user_online(user_id) values(${userId})")
    boolean loginUser(String userId);

    /**
     * 用户退出登录，更新在线用户表
     * @param userId 用户的用户名
     * @return 更新是否成功
     */
    @Delete("delete from tb_user_online where user_id = ${userId}")
    boolean logoutUser(String userId);

    /**
     * 更新用户状态
     * @param userId 用户的用户名
     * @param status 状态字，0代表在线但不在游戏中，1代表在游戏中
     * @return 更新是否成功
     */
    @Update("update tb_user_online set status = ${status} where user_id = ${userId}")
    boolean changeUserStatus(String userId, int status);
}
